package io.github.echarts.model;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 类别数据管理器，用于处理类别轴的数据
 */
public class CategoryManager {
    // 类别数据，按轴ID分组
    private Map<String, List<Object>> categories;
    
    // 类别索引映射，用于快速查找类别的索引位置
    private Map<String, Map<Object, Integer>> categoryIndices;
    
    /**
     * 创建类别管理器
     */
    public CategoryManager() {
        this.categories = new HashMap<>();
        this.categoryIndices = new HashMap<>();
    }
    
    /**
     * 添加类别数据
     * 
     * @param axisId 坐标轴ID
     * @param categoryList 类别列表
     */
    public void addCategories(String axisId, List<Object> categoryList) {
        if (categoryList == null || categoryList.isEmpty()) {
            return;
        }
        
        // 保存类别列表
        List<Object> axisCategories = categories.computeIfAbsent(axisId, k -> new ArrayList<>());
        
        // 保存类别索引映射
        Map<Object, Integer> indexMap = categoryIndices.computeIfAbsent(axisId, k -> new HashMap<>());
        
        for (Object category : categoryList) {
            if (!indexMap.containsKey(category)) {
                int index = axisCategories.size();
                axisCategories.add(category);
                indexMap.put(category, index);
            }
        }
    }
    
    /**
     * 获取类别列表
     * 
     * @param axisId 坐标轴ID
     * @return 类别列表，如果不存在则返回空列表
     */
    public List<Object> getCategories(String axisId) {
        return categories.getOrDefault(axisId, new ArrayList<>());
    }
    
    /**
     * 获取类别索引
     * 
     * @param axisId 坐标轴ID
     * @param category 类别值
     * @return 类别索引，如果不存在则返回-1
     */
    public int getCategoryIndex(String axisId, Object category) {
        Map<Object, Integer> indexMap = categoryIndices.get(axisId);
        if (indexMap != null && indexMap.containsKey(category)) {
            return indexMap.get(category);
        }
        return -1;
    }
    
    /**
     * 获取类别数量
     * 
     * @param axisId 坐标轴ID
     * @return 类别数量
     */
    public int getCategoryCount(String axisId) {
        List<Object> axisCategories = categories.get(axisId);
        return axisCategories != null ? axisCategories.size() : 0;
    }
    
    /**
     * 根据索引获取类别
     * 
     * @param axisId 坐标轴ID
     * @param index 索引
     * @return 类别值，如果索引无效则返回null
     */
    public Object getCategory(String axisId, int index) {
        List<Object> axisCategories = categories.get(axisId);
        if (axisCategories != null && index >= 0 && index < axisCategories.size()) {
            return axisCategories.get(index);
        }
        return null;
    }
    
    /**
     * 清空类别数据
     */
    public void clear() {
        categories.clear();
        categoryIndices.clear();
    }
} 